home *** CD-ROM | disk | FTP | other *** search
/ 10,000 Great Games / 10,000 Great Games.iso / Product / 66 / data1.cab / Source_Files / Src / Bubble.cpp < prev    next >
C/C++ Source or Header  |  2000-01-16  |  2KB  |  127 lines

  1. #include "stdafx.h"
  2.  
  3. cBubble *bubbles = 0;
  4.  
  5. static cTimer bubble_wait;
  6.  
  7. void cBubble::make()
  8. {
  9.     if (!bubble_wait && !bubble_list.is_empty())
  10.     {
  11.         new cBubble ();
  12.         
  13.         bubble_wait = 20 * sec + rnd(60 * sec);
  14.     }
  15. }
  16.  
  17. cBubble::cBubble(int _vy, cCharacter *_contents)
  18.     : cGameObject(bubble_list.get_random())
  19.     add((cList **)&bubbles);
  20.     
  21.     set_sequence("MOVING", TRUE);
  22.     
  23.     set_position(rnd(surface->h), surface->start);
  24.     make_dirty();
  25.     
  26.     // Set vertical speed
  27.     
  28.     if (_vy <= 0)
  29.         vy = BUBBLE_VSPEEDC + rnd(BUBBLE_VSPEEDR);
  30.     else
  31.         vy = _vy;
  32.     
  33.     // Put contents in there
  34.     
  35.     contents = 0;
  36.     capture(_contents);
  37.     
  38.     // invulnerable bubble for outside fire?
  39.     
  40.     invulnerable = contents != 0;
  41.     
  42.     // Set other
  43.     
  44.     armor = 100;
  45.  
  46.     // Call control function directly
  47.  
  48.     control();
  49. }
  50.  
  51. cBubble::~cBubble()
  52. {
  53.     new cEffect (x, y, orig, "EXPLODE");
  54.     
  55.     if (contents != 0)
  56.         contents->release();
  57. }
  58.  
  59. void cBubble::capture(cCharacter *ch)
  60. {
  61.     // Capture character?
  62.     
  63.     if (contents == 0 && ch != 0 && !ch->is_captured() && !ch->is_dead())
  64.     {
  65.         contents = ch;
  66.         
  67.         contents->make_dirty();
  68.         contents->capture(this);
  69.         contents->set_position(x, y);
  70.         contents->make_dirty();
  71.     }
  72. }
  73.  
  74. int cBubble::control()
  75.     // Check explode
  76.     
  77.     if (armor <= 0)
  78.         return FALSE;
  79.     
  80.     // Do movement
  81.     
  82.     cGameObject::control();  
  83.     
  84.     // Check if bubble is getting out of screen
  85.     
  86.     if (y < surface->start)
  87.         set_position(x, surface->start);
  88.     
  89.     // Adjust horizontal speed
  90.     
  91.     if (!x_on_screen())
  92.         vx = -vx / 2;
  93.     
  94.     if (!constant_speed)
  95.     {
  96.         new_x_push(1, 0, pmrnd(BUBBLE_HSPEEDR));
  97.         
  98.         constant_speed = sec + rnd(BUBBLE_CHANGE);
  99.     }
  100.     
  101.     // If empty check if anyone jumps in
  102.     
  103.     if (contents == 0)
  104.         capture((cCharacter *)check_radial_boundaries(&cCircle(0, 0, 5), players));
  105.     
  106.     // Move capture around
  107.     
  108.     if (contents != 0)
  109.     {
  110.         contents->make_dirty();
  111.         contents->set_position(x, y - CHAR_HEIGHT / 2);
  112.         contents->make_dirty();
  113.     }
  114.     
  115.     // Check if on top of screen
  116.     
  117.     return y <= surface->start + surface->h - BUBBLE_EXPLODE_ZONE;
  118. }
  119.  
  120. void cBubble::hit(cWeapon *w)
  121. {
  122.     if (!invulnerable)
  123.         armor -= w->armor_power;
  124. }
  125.